package com.the.ui.widge.photoview

import android.content.Context
import android.util.AttributeSet
import android.widget.OverScroller

//  ┏┓　　　┏┓
//┏┛┻━━━┛┻┓
//┃　　　　　　　┃
//┃　　　━　　　┃
//┃　┳┛　┗┳　┃
//┃　　　　　　　┃
//┃　　　┻　　　┃
//┃　　　　　　　┃
//┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
/**
 * @author The one
 * @date 2021-11-03 16:56
 * @describe 跟随点击位置放大时平移.抛掷
 * @email 625805189@qq.com
 * @remark
 */
open class PhotoView5
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : PhotoView4(context, attrs, defStyleAttr, defStyleRes) {

    private val overScroller:OverScroller by lazy {
        OverScroller(context)
    }
    private val flingRunnable:FlingRunnable by lazy {
        FlingRunnable()
    }

    /**
     * move事件
     * @param distanceX Float 在X轴上滑动的距离（单位时间） 旧位置 - 新位置
     * @param distanceY Float
     */
    override fun onScroll(distanceX: Float, distanceY: Float) {
        // 只有在放大的情况下才进行移动
        if(isEnlarge){
            offsetX-=distanceX
            offsetY-=distanceY
            fixOffsets()
            invalidate()
        }
    }

    /**
     * 抛掷
     * @param velocityX Float
     * @param velocityY Float
     */
    override fun onFling(velocityX: Float, velocityY: Float) {
        if(isEnlarge){
            // 只会执行一次
            val fixX = ((mBitmap.width*bigScale - width)/2).toInt()
            val fixY = ((mBitmap.height*bigScale - height)/2).toInt()
            overScroller.fling(offsetX.toInt(),offsetY.toInt(),velocityX.toInt(),velocityY.toInt(),-fixX,fixX,-fixY,fixY,100,100)
            postOnAnimation(flingRunnable)
        }
    }

    inner class FlingRunnable :Runnable{
        override fun run() {
            // 动画还在执行
            if(overScroller.computeScrollOffset()){
                offsetX = overScroller.currX.toFloat()
                offsetY = overScroller.currY.toFloat()
                invalidate()
                postOnAnimation(this)
            }
        }

    }

}